//package com.yunhoo.checkFlow.factory.impl;
//
//import com.ibatis.sqlmap.client.SqlMapClient;
//import com.yunhoo.checkFlow.factory.dao.BillCheck;
//import com.yunhoo.checkFlow.model.FlowInfo;
//import com.yunhoo.checkFlow.model.FlowModel;
//import com.yunhoo.sys.db.util.IbatisTemplate;
//import com.yunhoo.sys.util.common.LoginParam;
//import java.sql.SQLException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.logging.Level;
//import java.util.logging.Logger;
//
//public abstract class BaseCheck_backup implements BillCheck {
//
//    private final String NAMESPACE_FLOW = "flowInfo.";
//    private String billType;
//    private String checkerId;
//    private String checkerRole;
//    //
//    private String billNumberOld = "";
//    //
//    private FlowModel flowModel = null;//当前审批人 节点
//    private List<FlowModel> flowModelList = null;//流程列表
//    private List<FlowInfo> flowInfoList = null;//审批信息列表
//
//    public BaseCheck_backup(String billType, String checkerId, String checkerRole) {
//        this.billType = billType;
//        this.checkerId = checkerId;
//        this.checkerRole = checkerRole;
//        init();
//    }
//
//    private void init() {
//        /* 初始化 FlowModel */
//        Map map = paramMap();
//        map.put("type", billType);
//        map.put("checker", checkerId);
//        map.put("checkRole", checkerRole);
//        flowModel = (FlowModel) IbatisTemplate.query(NAMESPACE_FLOW + "queryFlowModelByCheckerAndRole", map);
//
//        if (flowModel == null) return;
//
//        /* 初始化 整个审批流模型 列表 */
//        Map map1 = paramMap();
//        map1.put("type", billType);
//        flowModelList = IbatisTemplate.queryForList(NAMESPACE_FLOW + "queryFlowModelList", map);
//
//
//    }
//
//    /*
//     * 在审批流中，对当前审批人来说，单据所处的状态，
//     *  0：等待（审批人）审批，
//     *  1：（审批人）已审批通过,
//     * -2:  等待上级审批
//     * 
//     * -1 和 99 ：单据审批已经结束
//     */
//    @Override
//    public String buildBillStatus(String number, String flowMark) {
//        if ("-1".equals(flowMark)) return "-1";
//        if ("99".equals(flowMark)) return "99";
//
//        String flag;
//        String fid;
//        String isConfirm;
//        int count = 0;
//        List<FlowModel> levelModelList = getFlowModelListByLevel(flowModel.getCheckLevel() - 1);
//
//        for (FlowInfo info : getFlowInfoList(number)) {
//            fid = info.getFid();
//            isConfirm = info.getIsConfirm();
//
//            /* 当前审批人 是否审批 */
//            if (fid.equals(flowModel.getFid()) && "1".equals(info.getIsConfirm())) {//已有该条目的 审批通过 记录
//                flag = "1";
//                return flag;
//            }
//
//            /* 当前审批人没有审批，检测上级节点是否审批完成 */
//            for (FlowModel model : levelModelList) {
//                if (fid.equals(model.getFid()) && "1".equals(isConfirm)) {//已有该条目的 通过记录,
//                    count++;
//                }
//            }
//        }
//
//        /* 当前审批人没有审批,并且 处在 第一层级 */
//        if (flowModel.getCheckLevel() == 1) {
//            System.out.println(" * * * " + "checkLevel == 1" + "  * * * ");
//            return "0";
//        }
//
//        /* 层级通过条目 == 层级节点数 */
//        if (count == levelModelList.size()) {
//            flag = "0";
//        } else flag = "-2";
//        return flag;
//    }
//
//    /* 是最后一个审批人 */
//    private boolean isLastNode(SqlMapClient client, String billNumber) throws SQLException {
//        /* 审批信息通过的条数 == 审批模型 节点数量 -1  ==> 是最后一个审批人 */
//
//        List li = getFlowInfoListImmediately(client, billNumber);
//        if (li == null || li.isEmpty()) return false;
//        return li.size() == flowModelList.size() - 1;
//    }
//
//    /* 是第一个审批人 */
//    private boolean isFirstNode(SqlMapClient client, String billNumber) throws SQLException {
//        /* 列表为空 ==> 尚无人审批 */
//        List li = getFlowInfoListImmediately(client, billNumber);
//        return (li == null || li.isEmpty());
//    }
//
//    /* 通过 */
//    @Override
//    public boolean pass(String billNumber, FlowInfo flowInfo) {
//        System.out.println(" * * * " + "contract pass" + "  * * * ");
//        System.out.println("billNumber = " + billNumber);
//        System.out.println("billType = " + billType);
//        System.out.println("checkerId = " + checkerId);
//        System.out.println("checkerRole = " + checkerRole);
//
//        flowInfo.setNumber(billNumber);
//        flowInfo.setFid(flowModel.getFid());
//        flowInfo.setChecker(checkerId);
//        flowInfo.setIsCheck("1");
//        flowInfo.setType(billType);
//
//        SqlMapClient client = IbatisTemplate.getSqlMapClient();
//        try {
//            client.startTransaction();
//
//            /* 更新flowMark */
//            String flowMark = "2";
//            if (isLastNode(client, billNumber)) {//注意：该判断 依赖 审批信息条数，因此必须在 保存审批信息之前
//                flowMark = "99";//最后一个审批人，flowMark 置为 99 审批结束
//            }
//            updateFlowMark(client, billNumber, flowMark);
//
//            /* 将以前的审批信息 isCheck 置为 0 */
//            Map map = paramMap();
//            map.put("number", billNumber);
//            map.put("fid", flowModel.getFid());
//            client.update(NAMESPACE_FLOW + "updateFlowInfoIsCheck", map);
//
//            /* 保存审批信息 */
//            client.insert(NAMESPACE_FLOW + "insertFlowInfo", flowInfo);
//
//            /* 保存审批信息 到 历史信息表 */
//            client.insert(NAMESPACE_FLOW + "insertFlowInfo_history", flowInfo);
//
//            client.commitTransaction();
//        } catch (SQLException ex) {
//            Logger.getLogger(BaseCheck_backup.class.getName()).log(Level.SEVERE, null, ex);
//
//            /* 遇到异常，返回false,注意：返回之前 finally 内的内容会执行，故不用担心会跳过finally */
//            return false;
//        } finally {
//            try {
//                client.endTransaction();
//            } catch (SQLException ex) {
//                Logger.getLogger(BaseCheck_backup.class.getName()).log(Level.SEVERE, null, ex);
//            }
//            System.out.println(" * * * " + " finlly " + "  * * * ");
//        }
//
//        /* 程序正常结束，返回true */
//        return true;
//    }
//
//    /* 退回 */
//    @Override
//    public boolean sendBack(String billNumber, FlowInfo flowInfo) {
//        System.out.println(" * * * " + "contract sendBack" + "  * * * ");
//        System.out.println("billNumber = " + billNumber);
//        System.out.println("billType = " + billType);
//        System.out.println("checkerId = " + checkerId);
//        System.out.println("checkerRole = " + checkerRole);
//
//        flowInfo.setNumber(billNumber);
//        flowInfo.setFid(flowModel.getFid());
//        flowInfo.setChecker(checkerId);
//        flowInfo.setIsCheck("0");
//        flowInfo.setType(billType);
//
//        SqlMapClient client = IbatisTemplate.getSqlMapClient();
//        try {
//            client.startTransaction();
//
//            /* 将以前的审批信息 isCheck 置为 0 */
//            Map map = paramMap();
//            map.put("number", billNumber);
//            map.put("fid", flowModel.getFid());
//            client.update(NAMESPACE_FLOW + "updateFlowInfoIsCheck", map);
//
//            /* 保存审批信息 */
//            client.insert(NAMESPACE_FLOW + "insertFlowInfo", flowInfo);
//
//            /* 保存审批信息 到 历史信息表 */
//            client.insert(NAMESPACE_FLOW + "insertFlowInfo_history", flowInfo);
//
//            /* 退回到上级节点 ==> 将上级节点 isCheck 置为 0 */
//            Map map1 = paramMap();
//            map1.put("number", billNumber);
//            for (FlowModel model : getFlowModelListByLevel(flowModel.getCheckLevel() - 1)) {
//                map1.put("fid", model.getFid());
//                client.update(NAMESPACE_FLOW + "updateFlowInfoIsCheck", map1);
//            }
//
//            /* 更新flowMark */
//            String flowMark = "2";
//            if (isFirstNode(client, billNumber)) {//注意：该判断 依赖 审批信息条数，且与通过不同，必须在修改以前审批信息 isCheck = 0 之后
//                flowMark = "-1";//第一个审批人，flowMark 置为 -1 单据退回给 录入人
//            }
//            updateFlowMark(client, billNumber, flowMark);
//
//            client.commitTransaction();
//        } catch (SQLException ex) {
//            Logger.getLogger(BaseCheck_backup.class.getName()).log(Level.SEVERE, null, ex);
//
//            /* 遇到异常，返回false,注意：返回之前 finally 内的内容会执行，故不用担心会跳过finally */
//            return false;
//        } finally {
//            try {
//                client.endTransaction();
//            } catch (SQLException ex) {
//                Logger.getLogger(BaseCheck_backup.class.getName()).log(Level.SEVERE, null, ex);
//            }
//            System.out.println(" * * * " + " finlly " + "  * * * ");
//        }
//
//        /* 程序正常结束，返回true */
//        return true;
//    }
//
//    /* 取消审批 */
//    @Override
//    public boolean cancelCheck(String billNumber) {
//        System.out.println(" * * * " + "contract cancelCheck" + "  * * * ");
//        System.out.println("billNumber = " + billNumber);
//        System.out.println("billType = " + billType);
//        System.out.println("checkerId = " + checkerId);
//        System.out.println("checkerRole = " + checkerRole);
//
//        SqlMapClient client = IbatisTemplate.getSqlMapClient();
//        try {
//            client.startTransaction();
//
//            /* 将以前的审批信息 isCheck 置为 0 */
//            Map map = paramMap();
//            map.put("number", billNumber);
//            map.put("fid", flowModel.getFid());
//            client.update(NAMESPACE_FLOW + "updateFlowInfoIsCheck", map);
//
//            /* 更新flowMark */
//            updateFlowMark(client, billNumber, "2");
//
//            client.commitTransaction();
//        } catch (SQLException ex) {
//            Logger.getLogger(BaseCheck_backup.class.getName()).log(Level.SEVERE, null, ex);
//
//            /* 遇到异常，返回false,注意：返回之前 finally 内的内容会执行，故不用担心会跳过finally */
//            return false;
//        } finally {
//            try {
//                client.endTransaction();
//            } catch (SQLException ex) {
//                Logger.getLogger(BaseCheck_backup.class.getName()).log(Level.SEVERE, null, ex);
//            }
//            System.out.println(" * * * " + " finlly " + "  * * * ");
//        }
//
//        /* 程序正常结束，返回true */
//        return true;
//    }
//
//    /* 所有审批信息 查询条件：number = #number# and type = #type# */
//    @Override
//    public List<FlowInfo> historyFlowInfo(String billNumber) {
//        System.out.println(" * * * " + "historyFLowInfo" + "  * * * ");
//
//        FlowInfo param = new FlowInfo(true);
//        param.setType(billType);
//        param.setNumber(billNumber);
//        return IbatisTemplate.queryForList(NAMESPACE_FLOW + "queryFlowInfoByNumberAndType", param);
//    }
//
//    /* flowModel 条件：type = #billType# and isPub = 1 and checkLevel = #checkLevel# */
//    private List<FlowModel> getFlowModelListByLevel(int checkLevel) {
//        List<FlowModel> templi = new ArrayList();
//        for (FlowModel model : flowModelList) {
//            if (model.getCheckLevel().intValue() == checkLevel) templi.add(model);
//        }
//        return templi;
//    }
//
//    /* infoList 条件：number = #billNumber# and isCheck = 1
//     * 注意：审批时，通过的，会将以前审批的 isCheck 置为 0；
//     * 退回的也会将以前审批的 isCheck 置为 0，同时，保存的审批信息 isCheck 也为0；
//     * 所有，isCheck = 1  ==> 是所有通过的审批信息
//     */
//    private List<FlowInfo> getFlowInfoList(String billNumber) {
//        if (flowInfoList == null || !billNumberOld.equals(billNumber)) {
//            FlowInfo param = new FlowInfo(true);
//            param.setType(billType);
//            param.setNumber(billNumber);
//            flowInfoList = IbatisTemplate.queryForList(NAMESPACE_FLOW + "queryFlowInfoListOfIsChecked", param);
//        }
//        return flowInfoList;
//    }
//
//    private List<FlowInfo> getFlowInfoListImmediately(SqlMapClient client, String billNumber) throws SQLException {
//
//        FlowInfo param = new FlowInfo(true);
//        param.setType(billType);
//        param.setNumber(billNumber);
//        flowInfoList = client.queryForList(NAMESPACE_FLOW + "queryFlowInfoListOfIsChecked", param);
//        return flowInfoList;
//    }
//
//    private Map paramMap() {
//        Map map = new HashMap();
//        map.put("orgCode", LoginParam.getOrg().getCode());
//        map.put("iyear", LoginParam.getIyear());
//        return map;
//    }
//
//    /* 更新外部单据 的 flowMark */
//    abstract void updateFlowMark(SqlMapClient client, String billNumber, String flowMark) throws SQLException;
//}
